#include "widget.h"
#include "./ui_widget.h"
#include <QPainter>
#include <QDebug>
#include <QRandomGenerator>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    resize(800, 600);
    setWindowTitle("小球运动演示");


    // 初始化 5 个小球
    for (int i = 0; i < 5; ++i) {
        // 随机位置和速度
        qreal x = QRandomGenerator::global()->bounded(width());
        qreal y = QRandomGenerator::global()->bounded(height());
        qreal vx = QRandomGenerator::global()->bounded(4.0) - 2.0; // [-2, 2)
        qreal vy = QRandomGenerator::global()->bounded(4.0) - 2.0; // [-2, 2)
        m_balls.append(Point(x, y, vx, vy));
    }


    // 设置定时器，每30毫秒更新一次位置
    m_timer = new QTimer(this);
    connect(m_timer, &QTimer::timeout, this, &Widget::updateBallsPosition);
    m_timer->start(30);

}

Widget::~Widget()
{
    delete ui;
    delete m_timer;
}


void Widget::paintEvent(QPaintEvent *event) {
    Q_UNUSED(event);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);


    // 绘制所有小球
    painter.setBrush(Qt::red);
    for (auto it = m_balls.constBegin(); it != m_balls.constEnd(); ++it) {
        QPointF pos = it->position();
        painter.drawEllipse(pos, 10, 10); // 半径为10的圆形
    }
}

void Widget::updateBallsPosition() {

    for (Point &ball : m_balls) {
        ball.move();

        /* 小球随机移动，同时避免“锐角转弯” */
/*
        // 每次移动都可能触发角度变化，轨迹较为混乱，可能出现抖动
        // 计算当前角度（弧度）
        qreal angle = atan2(ball.vy(), ball.vx());

        // 生成一个小的角度扰动 [-5°, 5°]
        qreal angleDelta = QRandomGenerator::global()->bounded(10) - 5.0;
        angle += qDegreesToRadians(angleDelta); // 转换为弧度

        // 计算新速度（保持原速度大小）
        qreal speed = qSqrt(ball.vx() * ball.vx() + ball.vy() * ball.vy());
        ball.setVx(speed * cos(angle));
        ball.setVy(speed * sin(angle));
*/


        // 轨迹较为平滑，调整随机值范围可以改变轨迹混乱程度
        // 目标速度（随机微调）
        qreal targetVx = ball.vx() + (QRandomGenerator::global()->bounded(0.8) - 0.3);
        qreal targetVy = ball.vy() + (QRandomGenerator::global()->bounded(0.8) - 0.5);

        // 逐步逼近目标速度（平滑过渡）
        const qreal smoothingFactor = 0.1; // 越小越平滑，但是速度变化越慢，此处是按照10%的距离移动
        ball.setVx(ball.vx() + smoothingFactor * (targetVx - ball.vx()));
        ball.setVy(ball.vy() + smoothingFactor * (targetVy - ball.vy()));


        update();  // 触发重绘

        // 边界检查
        QPointF pos = ball.position();
        if (pos.x() < 0 || pos.x() > width()) {
            ball.setVx(-ball.vx());
        }
        if (pos.y() < 0 || pos.y() > height()) {
            ball.setVy(-ball.vy());
        }
    }

}
